x86 hvm: Change default setting of guest CPUID RDTSCP bit
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 13 Jan 2010 08:33:34 +0000 (08:33 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 13 Jan 2010 08:33:34 +0000 (08:33 +0000)
Expose RDTSCP CPUID to guest only when tsc_mode == TSC_MODE_DEFAULT
and host_tsc_is_safe() returns 1.

Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com>
xen/arch/x86/hvm/hvm.c
xen/arch/x86/time.c
xen/include/asm-x86/time.h

index 3bfe57cec40e873246a1c47d3f70852dfe6abe70..216f818f1c660eac3f13d662a96b21900c9b7730 100644 (file)
@@ -1955,8 +1955,10 @@ void hvm_cpuid(unsigned int input, unsigned int *eax, unsigned int *ebx,
         }
         break;
     case 0x80000001:
-        /* Don't expose RDTSCP feature when in PVRDTSCP mode. */
-        if ( v->domain->arch.tsc_mode == TSC_MODE_PVRDTSCP )
+        /* We expose RDTSCP feature to guest only when
+           tsc_mode == TSC_MODE_DEFAULT and host_tsc_is_safe() returns 1 */
+        if ( v->domain->arch.tsc_mode != TSC_MODE_DEFAULT ||
+             !host_tsc_is_safe() )
             *edx &= ~bitmaskof(X86_FEATURE_RDTSCP);
         break;
     }
index e049c6d43b37eec51b16fdf33aed9014021dba8c..292d797142462ee9ecd2abbe1c81a0888fcb3d91 100644 (file)
@@ -1628,7 +1628,7 @@ void pv_soft_rdtsc(struct vcpu *v, struct cpu_user_regs *regs, int rdtscp)
              (d->arch.tsc_mode == TSC_MODE_PVRDTSCP) ? d->arch.incarnation : 0;
 }
 
-static int host_tsc_is_safe(void)
+int host_tsc_is_safe(void)
 {
     if ( boot_cpu_has(X86_FEATURE_TSC_RELIABLE) )
         return 1;
index 6a9b9df671b2a61b6bbf66a047e39c1185419b92..766178a793eb96fd26644085d52bb6bab5da3f30 100644 (file)
@@ -70,6 +70,7 @@ void tsc_get_info(struct domain *d, uint32_t *tsc_mode, uint64_t *elapsed_nsec,
 
 void force_update_vcpu_system_time(struct vcpu *v);
 
+int host_tsc_is_safe(void);
 void cpuid_time_leaf(uint32_t sub_idx, unsigned int *eax, unsigned int *ebx,
                       unsigned int *ecx, unsigned int *edx);